#
# CPP-Sandbox, C++ code coverage demonstration.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met: 1) Redistributions of source code must retain the above
# copyright notice, this list of conditions and the following
# disclaimer. 2) Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution. 3) Neither the name of the CPP-Sandbox nor
# the names of its contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
# OF THE POSSIBILITY OF SUCH DAMAGE.
#
# @author Yegor Bugayenko <egor@tpc2.com>
# @version $Id: Makefile 13 2011-09-13 11:43:14Z yegor256@gmail.com $
#

VERSION = 1.0

.DEFAULT_GOAL := all
MAKEFLAGS = -r
CPP = /Applications/TestCocoon/csg++
SRC = src
EXEC = main
TEST_RUNNER = tests
TESTS = test
BUILD = build
DEPENDS = $(BUILD)/dependencies
LDFLAGS = -lcppunit -ldl
CPPFLAGS = -fPIC -g -I $(SRC)

CPP_FILES = $(shell find $(SRC) -name "*.cpp")
TEST_FILES = $(shell find $(TESTS) -name "*.cpp")
CPP_OBJS = $(CPP_FILES:%.cpp=$(BUILD)/%.o)
TEST_OBJS = $(TEST_FILES:%.cpp=$(BUILD)/%.o) $(BUILD)/tests.o
OBJS = $(CPP_OBJS) $(TEST_OBJS)

# instruct Make NOT to remove intermediate files
.SECONDARY:

# compile the product and run all tests
all: test $(EXEC)

# build dependencies
$(DEPENDS)/%.d: %.cpp
    @set -e; rm -f $@; \
    mkdir -p $(dir $@); \
    $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\(.*\.o\)[ :]*,$(patsubst %.cpp,$(BUILD)/%.o,$<) $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

-include $(CPP_FILES:%.cpp=$(DEPENDS)/%.d) $(TEST_FILES:%.cpp=$(DEPENDS)/%.d)

$(BUILD)/%.o: %.cpp
    @mkdir -p $(dir $@)
    $(CPP) $(CPPFLAGS) -o $@ -c $<

$(EXEC): $(OBJS) $(BUILD)/main.o
    $(CPP) -o $(EXEC) $(LDFLAGS) $(CPP_OBJS) $(BUILD)/main.o

$(TEST_RUNNER): $(OBJS)
    $(CPP) -o $(TEST_RUNNER) $(LDFLAGS) $(OBJS)

test: $(TEST_RUNNER)
    ./$(TEST_RUNNER)

# clean everything!
.PHONY: clean
clean:
    -rm -rf \
    $(TEST_RUNNER) \
    $(EXEC) \
    $(BUILD)/*
